package Other;

import java.util.HashMap;
import java.util.Map;

/**
 * @Classname JZ20
 * @Description TODO
 * @Date 2023/3/3 20:27
 * @Created by xjl
 */
public class JZ20 {
    /**
     * @description 使用状态机的方式来实现
     * @param: s
     * @date: 2023/3/3 20:28
     * @return: boolean
     * @author: xjl
     */
    public boolean isNumber(String s) {
        Map[] states = {
                new HashMap<Character, Integer>() {{
                    put(' ', 0);
                    put('s', 1);
                    put('d', 2);
                    put('.', 4);
                }}, // 0.
                new HashMap<Character, Integer>() {{
                    put('d', 2);
                    put('.', 4);
                }},                           // 1.
                new HashMap<Character, Integer>() {{
                    put('d', 2);
                    put('.', 3);
                    put('e', 5);
                    put(' ', 8);
                }}, // 2.
                new HashMap<Character, Integer>() {{
                    put('d', 3);
                    put('e', 5);
                    put(' ', 8);
                }},              // 3.
                new HashMap<Character, Integer>() {{
                    put('d', 3);
                }},                                        // 4.
                new HashMap<Character, Integer>() {{
                    put('s', 6);
                    put('d', 7);
                }},                           // 5.
                new HashMap<Character, Integer>() {{
                    put('d', 7);
                }},                                        // 6.
                new HashMap<Character, Integer>() {{
                    put('d', 7);
                    put(' ', 8);
                }},                           // 7.
                new HashMap<Character, Integer>() {{
                    put(' ', 8);
                }}                                         // 8.
        };
        int p = 0;
        char t;
        for (char c : s.toCharArray()) {
            if (c >= '0' && c <= '9') {
                t = 'd';
            } else if (c == '+' || c == '-') {
                t = 's';
            } else if (c == 'e' || c == 'E') {
                t = 'e';
            } else if (c == '.' || c == ' ') {
                t = c;
            } else {
                t = '?';
            }
            if (!states[p].containsKey(t)) {
                return false;
            }
            p = (int) states[p].get(t);
        }
        return p == 2 || p == 3 || p == 7 || p == 8;
    }

    /**
     * @description 使用暴力的方法来实现
     * 1 删除两端空格
     * 2 如果第一个是（+、-） 那就删除第一个字符
     * 3 将剩下的安装E 替换成为e 然后切割
     * 4     如果第二长度大于0 那么判断第二是否合格的整数 ，同时如果有（+-）需要删除
     * 5     判断第一个是否树数字和第二是否为存数字
     * 6 如果没有e 直接判断是否为字符串
     * @param: s
     * @date: 2023/3/3 20:29
     * @return: boolean
     * @author: xjl
     */
    public boolean isNumber2(String s) {
        s = s.trim();
        if (s.length() == 0) {
            return false;
        }
        if (s.charAt(0) == '+' || s.charAt(0) == '-') {
            s = s.substring(1);
        }
        s = s.replace('E', 'e');
        if (s.indexOf('e') >= 0) {
            // 表示中间有e
            int indexe = s.indexOf('e');
            String first = s.substring(0, indexe);
            String second = s.substring(indexe + 1);
            if (s.length() > 0) {
                if (second.charAt(0) == '+' || second.charAt(0) == '-') {
                    second = second.substring(1);
                }
                return vaildNumver(first) && vailpureNumber(second);
            }
        }
        return vaildNumver(s);
    }

    /**
     * @description 是否为纯数字
     * @param: s
     * @date: 2023/3/3 20:45
     * @return: boolean
     * @author: xjl
     */
    private boolean vailpureNumber(String s) {
        if (s.length() == 0) {
            return false;
        }
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) < '0' || s.charAt(i) > '9') {
                return false;
            }
        }
        return false;
    }

    /**
     * @description 判断字符串是否为数字
      * @param: s
     * @date: 2023/3/3 20:48
     * @return: boolean
     * @author: xjl
    */
    private boolean vaildNumver(String s) {
        if (s.indexOf('.') >= 0) {
            int index = -s.indexOf('.');
            String first = s.substring(0, index);
            String second = s.substring(index + 1);
            if (first.length() > 0 && second.length() > 0) {
                return vailpureNumber(first) && vailpureNumber(second);
            } else if (second.length() > 0) {
                return vailpureNumber(second);
            } else {
                return vailpureNumber(first);
            }
        }
        return vailpureNumber(s);
    }
}
